# 在1基础上，将前景目标进行分割，进一步使用不同颜色矩形框标记，并在命令行窗口中输出每个矩形框的位置和大小。
import cv2 as cv

videoFileName=r"D:\AI\第三周\vtest.avi"
cap=cv.VideoCapture(videoFileName)
fgbg=cv.createBackgroundSubtractorMOG2()

thresh=200
count=0
while True:
    ret,frame=cap.read()
    if not ret:#没读到当前帧，结束
        break
    fgmask=fgbg.apply(frame)# 运用MOG2的apply方法完成对背景的更新，返回经过背景更新采集到的前景对应的掩膜，fgmask是一个二值化
#                                  # 图像，白色代表前景的像素
    _,fgmask = cv.threshold(fgmask, 30,0xff, cv.THRESH_BINARY)#阈值化处理，过滤
    bgImage=fgbg.getBackgroundImage()
    _,cnts,_=cv.findContours(fgmask.copy(),cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    for c in cnts:
        area=cv.contourArea(c)
        if (area<thresh):
            continue
        count+=1
        #boundingRect函数返回四个参数（左上角坐标，矩形的宽高）
        x, y, w, h = cv.boundingRect(c)

        cv.putText(frame, str(count), (x, y), cv.FONT_HERSHEY_PLAIN, 2, (0, 0, 255))  # 显示检测到的目标的标号
        cv.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 3)
        """
        函数cv:：rectangle绘制一个矩形轮廓或一个填充矩形，该矩形的两个对角是PT1和PT2。
        第一个参数：img是原图
        第二个参数：（x，y）是矩阵的左上点坐标
        第三个参数：（x+w，y+h）是矩阵的右下点坐标
        第四个参数：（0,255,0）是画线对应的rgb颜色
        第五个参数：2是所画的线的宽度
        """
        print("第{}个前景目标的坐标为：（{},{}），大小为：{}".format(count,x,y,w*h))

    #print('共检测到',count,frame)
    cv.imshow('frame',frame)
    cv.imshow('Background',bgImage)
    cv.imshow("Foregroundmask", fgmask)  # 前景
    key=cv.waitKey(120)
    if key==27:
        break
cap.release()
cv.destroyAllWindows()